#!/user/bin/env python
# -*- coding: UTF-8 -*-
# author:ZLP
# Create Time:2023.5.30
# Content:用于软件启动前的初始化，如配置文件的设置、通行证的登录、打开软件
"""
该文件用于 初始化软件所需要的操作
"""
import os
import time
import uiautomation as auto
from utils.read_config import readconfig
from common import soft_db
from utils.utils_log import loggerCase
from utils.utils_operation import run_time
from utils.utils_operation import cal_ratio

# 1、使用批处理命令关闭软件，相等于直接杀进程
# 2、参数app_name是exe的名称，不输入则默认为FreeScan.exe
def close_app_kill():
    """
    关闭软件
    :return:
    """
    # EXStar.exe
    os.system("taskkill /F /IM " + readconfig.colse_app_kill_appname)
    # 把其他的相关进程杀一遍
    os.system("taskkill /F /IM SnSyncService.exe")
    os.system("taskkill /F /IM Shining3DUserAccount.exe")
    loggerCase.info("已kill相关进程")
    time.sleep(1)


# 登录通行证，使用用户名登录，需要输入用户名和密码,在config.yaml中修改，默认不需要输入设备序列号
# 进行判断:如果直接出现程序，则说明已经登录，如果出现先临通行证，但是没有出现程序，说明未登录
def enter_pass():
    """
    等待启动软件成功
    :return:
    """
    app = "Shining 3D User Account"
    user = readconfig.enter_pass_user
    password = readconfig.enter_pass_password
    soft_app = readconfig.app_name
    # 判断通行证是否出现，若没有则循环等待
    while not auto.WindowControl(Name=app).Exists(maxSearchSeconds=1):
        loggerCase.info("等待通行证窗口出现中。。。")
        if auto.WindowControl(Name=soft_app).Exists(maxSearchSeconds=1):
            loggerCase.info("判断已登录通行证，跳过通行证登录。")
            return
    user_account = auto.WindowControl(Name=app)
    # user_account.EditControl(foundIndex=2).SendKeys(auto.Keys.VK_CLEAR)
    user_account.EditControl(foundIndex=2).SetFocus()
    auto.SendKeys("{Ctrl}a")
    user_account.EditControl(foundIndex=2).SendKeys(user)

    user_account.EditControl(foundIndex=3).SetFocus()
    auto.SendKeys("{Ctrl}a")
    user_account.EditControl(foundIndex=3).SendKeys(str(password))
    user_account.ButtonControl(Name="Login").Click()


# 需要再写一个前提的函数
# 1、前提当前无软件打开；
# 2、参数是路径+exe名称，如果是默认路径可以不写参数，路径中\和/都可以
# 3、执行打开软件前，可以先执行下close_app_kill函数，把所有的进程都杀死
# 如：app=C:\Shining3d\FreeScan\FreeSan.exe,其中\或/都可以
#@run_time
# def launch_app():
#     """
#     启动软件
#     :return:
#     """
#     app = readconfig.launch_app
#     loggerCase.info("app路径："+app)
#     try:
#         app_path, app_name = app.rsplit("\\", 1)
#     except ValueError:
#         app_path, app_name = app.rsplit("/", 1)
#     #os.system(r'start "" /d %s /wait %s' % (app_path, app_name))
#     os.system(r'start "" /d %s /wait "%s"' % (app_path, app_name))  # 注意FreeScan Trak的exe文件名有空格所以要用雙引號括起來，否則無法啟動
#
#
#
#     loggerCase.info("启动软件成功" + app_name)


@run_time
def launch_app():
    app = readconfig.launch_app

    try:
        app_path, app_name = app.rsplit("\\", 1)
    except ValueError:
        app_path, app_name = app.rsplit("/", 1)
    loggerCase.info("软件路径：{0}{1}".format(app_path,app_name))

    #os.system(r'start "" /d %s /wait "%s"' % (app_path, app_name)) # 注意FreeScan Trak的exe文件名有空格所以要用雙引號括起來，否則無法啟動
    #os.system('start "" /d {} /wait "{}"'.format(app_path,app_name))

    print(app_path)
    print("")
    print(app_name)

    os.system(r'start "" /d C:\shining3d\FreeTrak_TRAK /wait "FreeScan Trak.exe"')

    loggerCase.info("启动软件成功 " + app_name)



# def close_all_lanch_popFrame():
#     """
#     关闭所有启动弹框
#     :param driver: pc驱动
#     :return:
#     """
#
#     #关闭离线按钮
#     soft.close_offline()
#
#     #关闭小于15G按钮
#     soft.less_than_15g()


def modify_file_configuration():
    """
    修改文件配置
    :return:
    """
    # common.language_change()
    # soft_db.modify_cali_pic()

    # soft_db.modify_device_type()

    soft_db.modify_scan_pic()

# 进入各个模式
# 参数：分辨率，如1920,1080,默认就是1920*1080，标定--calib，扫描模式--scan_mode，扫描--scan，后处理--post_processing,测量--measurement
# 分辨率是1920*1080，导航栏两端宽400，高度是110
# @common.run_time
def enter_mode(mode_name="scan_mode"):
    """
    进入不同界面
    :param mode_name: 进入界面名称
    :return:
    """
    ratio = cal_ratio()
    # 减去头尾的400，中间是平均分的(1920 - 800) / 5 = 224，每个圆点分别为400，624，848，1072，1296，1520
    if mode_name == "Device":
        auto.Click(round(400 * ratio), round(105 * ratio), waitTime=1)
        loggerCase.info("点击重连")
    if mode_name == "calib":
        auto.Click(round(620 * ratio), round(105 * ratio), waitTime=1)
        loggerCase.info("进入标定")
    if mode_name == "scan_mode":
        auto.Click(round(847 * ratio), round(105 * ratio), waitTime=1)
        loggerCase.info("进入扫描模式")
    if mode_name == "scan":
        auto.Click(round(1070 * ratio), round(105 * ratio), waitTime=1)
        loggerCase.info("进入扫描界面")
    if mode_name == "post_processing":
        auto.Click(round(1296 * ratio), round(105 * ratio), waitTime=1)
        loggerCase.info("进入后处理")
    if mode_name == "measurement":
        auto.Click(round(1520 * ratio), round(105 * ratio), waitTime=1)
        loggerCase.info("进入测量")



if __name__ == '__main__':
    launch_app()